package com.common.android.ui.gif;

import java.io.Serializable;
import java.util.Vector;
import java.util.concurrent.Future;

import android.graphics.Bitmap;
import android.text.TextUtils;
import android.util.Log;

/**
 * ClassName:GifPlayer
 * Function:  GIF播放管理类
 * Reason:	 
 * @author   cb		
 * @version  Ver 1.3.3_modularization
 * @Date	 2014	2014-3-11		下午4:53:59
 *
 * @see 	 
 */
public class GifPlayer implements Serializable{
	public boolean isGif=false;			//是否GIF图片
	private static final long serialVersionUID = 1L;
	private IGifPlayInterface mGifInterface;		//播放监听
	private volatile boolean mIsPlaying=false;		//是否正在播放
	private Object mKey;					//缓存里的KEY，可能是一个资源的ID，也可能是一个本地文件的路径
	private Future<?> mScheduledFuture;		//播放的线程
	private PlayTask mPlayTask=new PlayTask();
	public GifPlayer(int resid){
		if (resid<=0){
			isGif=false;
			return;
		}
		mKey=resid;
	}
	
	public GifPlayer(String path){
		if (TextUtils.isEmpty(path)){
			isGif=false;
			return;
		}
		mKey=path;
	}
	
	/**
	 * @n<b>函数名称</b>     :getKey
	 * @brief 获取当前的KEY
	 * @version    Ver 1.3.3_modularization
	 * @param  @return
	 * @return Object
	 * @<b>作者</b>          :  cb
	 * @<b>创建时间</b>      :  2014-3-11下午5:44:26      
	*/
	public Object getKey(){
		return mKey;
	}
	
	/**
	 * @n<b>函数名称</b>     :stop
	 * @brief 停止播放动画
	 * @version    Ver 1.3.3_modularization
	 * @param  
	 * @return void
	 * @<b>作者</b>          :  cb
	 * @<b>创建时间</b>      :  2014-3-11下午5:44:48      
	*/
	public void stop(){
//		android.util.Log.d("gifview",mKey+ " stop");
		mIsPlaying=false;
		if (mScheduledFuture!=null ){
			//播放任务非空，取消当前任务
			mScheduledFuture.cancel(true);
		}
		mScheduledFuture=null;
	}
	
	/**
	 * @n<b>函数名称</b>     :start
	 * @brief 开始播放动画
	 * @version    Ver 1.3.3_modularization
	 * @param  
	 * @return void
	 * @<b>作者</b>          :  cb
	 * @<b>创建时间</b>      :  2014-3-11下午5:45:15      
	*/
	public void start(){
//		android.util.Log.d("gifview",mKey+ " start");
//		if (mIsPlaying){
//			android.util.Log.d("gifview","key already started:"+mKey);
//			return;
//		}
		//取出动画的第一帧显示到界面
//		if (!isGif){
//			Log.d("gifview", "not gif:"+mKey);
//			return;
//		}
		if (mScheduledFuture!=null){
//			android.util.Log.d("gifview",mKey+ " is already playing");
			//先取消当前在播放的任务
//			mScheduledFuture.cancel(true);
			return;
		}
		if (GifCacheManager.INSTANCE.get(mKey)==null){
//			Log.d("gifview", "null frames:"+mKey);
			return;
		}
		mIsPlaying=true;
		//重新从线程池里取出一个线程开始播放
		mScheduledFuture=GifCacheManager.INSTANCE.createNewFutureTask(mPlayTask);
	}
	
	/**
	 * @n<b>函数名称</b>     :setGifInterface
	 * @brief 设置播放监听接口
	 * @version    Ver 1.3.3_modularization
	 * @param  @param gifInterface
	 * @return void
	 * @<b>作者</b>          :  cb
	 * @<b>创建时间</b>      :  2014-3-11下午5:55:40      
	*/
	public void setGifInterface(IGifPlayInterface gifInterface){
		mGifInterface=gifInterface;
	}
	
	/**
	 * ClassName:PlayTask
	 * Function: 播放任务
	 * Reason:	 
	 * @author   cb		
	 * @version  Ver 1.3.3_modularization
	 * @Date	 2014	2014-3-12		上午11:18:20
	 *
	 * @see 	 
	 */
	private class PlayTask implements Runnable{
		
		@Override
		public void run() {
//			android.util.Log.d("gifview",mKey+ " isplaying,"+this.toString()+","+fsfsdfs++);
			Bitmap lastBitmap=null;
			Vector<GifFrame> mFrames=GifCacheManager.INSTANCE.get(mKey);
			while (mIsPlaying){
				//播放标志
				int size=mFrames.size();
				for (int i=0;i<size;i++){
					if (!mIsPlaying ){
						//被中断
						return;
					}
					//取当前帧
					Bitmap bmp=mFrames.get(i).getBitmap();
					if (bmp==null){
						//在某些异常的情况下，可能取到的当前帧的图片是空的，为了不使界面出现空白影响用户体验，使用上一个已显示的图片
						if (lastBitmap!=null && !lastBitmap.isRecycled()){
							bmp=lastBitmap;	
						}
					}else{
						lastBitmap=bmp;
					}
					if (bmp==null){
//						android.util.Log.d("gifview",mKey+ " isplaying null");	
					}
					if (mGifInterface!=null){
						mGifInterface.onPlaying(bmp);
					}
					try {
						Thread.sleep(mFrames.get(i).delay);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
}
